package agents.empleador;

import objects.centrotrabajo.*;
import agents.Agentes;
import agents.persona.*;

import repast.simphony.context.Context;
import repast.simphony.space.grid.Grid;
import repast.simphony.util.ContextUtils;

import java.util.*;

/*********************************************************************************************************************
 * Este Agente reacciona a la creacion de Centros de Trabajo, seleccionando el personal desempleado y ocupando las 
 * bacantes disponibles en el nuevo Centro. Se encarga de seleecionar el personal Rico y/o Pobre, asignar salario, etc.
 * 
 * @author Henry Alberto
 * @author Fedrico Lievano
 */

public class Empleador {
	
	private long ingresos;
	private CentroTrabajo nuevoCentro;

    protected static long agentIDCounter = 1;
    protected String agentID = "Empleador " + (agentIDCounter++);
    
	/*****************************************************************************************************************
	 * Constructores  del Agente. Es posible crear Empleadores con sus propiedades en nulo o con algun valor 
	 * en particular.
	 */
	public Empleador(){
		ingresos = 0;
		nuevoCentro = null;
	}
	
	public Empleador(long ingresos){
		this.ingresos = ingresos;
		this.nuevoCentro = null;
	}
	
	/*****************************************************************************************************************
	 * Emplea a las Personas en el nuevo Centro de Trabajo construido.
	 */
	public void asignarEmpleo(){
		//Tener referencia al contento sobre el cual se corre el modelo
		Context context = ContextUtils.getContext(this);
				
		//Se referencia la malla donde se dibujo el comportamiento de los agentes.
		Grid patch = (Grid) context.getProjection("Medellin Grid");
		
		/*****************************************************************************************************/
		ArrayList<Persona>	pobresDesempleados = new ArrayList<Persona>();
		ArrayList<Persona>	ricosDesempleados = new ArrayList<Persona>();
		
		for (Object parcial : patch.getObjects())//Se obtienen los elementos ubicados en el Modelo
		{
			if (parcial instanceof PersonaPobre)//Si el elemento k es de tipo PersonaPobre
			{
				if(!((Persona)parcial).isEmpleada()) //Si la Persona Pobre de la posicion k esta Desempleada
					pobresDesempleados.add((PersonaPobre)parcial); //Se almacena en el arreglo de Personas Pobres Desempleadas
			}
			else if (parcial instanceof PersonaRica)//Si el elemento k es de tipo PersonaRica
			{
				if(!((Persona)parcial).isEmpleada()) //Si la Persona Rica de la posicion k esta Desempleada
					ricosDesempleados.add((PersonaRica)parcial); //Se almacena en el arreglo de Personas Ricas Desempleadas
			}
		}

		/*****************************************************************************************************/
		//Dependiendo de la capacidad del Centro, el Empleador asigna capacidad/2 empleos a Personas Ricas y la
		//otra mitad a Personas Pobres. Las Personas desempleadas esta listadas en el Array. Dependiendo del numero 
		//de empleos asigandos, se actualizan las propiedades de desempleo del Gobierno.
		
		int capacidad = nuevoCentro.getCapacidad();
		
		if(capacidad == 120)
		{
			//Se emplea a los primeros 60 Ricos desempleados en el Array. Igual con los Pobres
			for(int i = 0; i<60; i++)
			{
				ricosDesempleados.get(i).Emplearce(nuevoCentro,100);
				pobresDesempleados.get(i).Emplearce(nuevoCentro,80);
			}
			//Se disminuye el nivel de desempleo en 60, tanto de los Pobres como Ricos
			Agentes.gobierno.setPersonasPobresDesempleadas(Agentes.gobierno.getPersonasPobresDesempleadas()-60);
			Agentes.gobierno.setPersonasRicasDesempleadas(Agentes.gobierno.getPersonasRicasDesempleadas()-60);
		}
		else if(capacidad == 80)
		{
			//Se emplea a los primeros 40 Ricos desempleados en el Array. Igual con los Pobres
			for(int i = 0; i<40; i++)
			{
				ricosDesempleados.get(i).Emplearce(nuevoCentro,80);
				pobresDesempleados.get(i).Emplearce(nuevoCentro,60);
			}
			//Se disminuye el nivel de desempleo en 40, tanto de los Pobres como Ricos
			Agentes.gobierno.setPersonasPobresDesempleadas(Agentes.gobierno.getPersonasPobresDesempleadas()-40);
			Agentes.gobierno.setPersonasRicasDesempleadas(Agentes.gobierno.getPersonasRicasDesempleadas()-40);
		}
		else
		{
			//Se emplea a los primeros 20 Ricos desempleados en el Array. Igual con los Pobres
			for(int i = 0; i<20; i++)
			{
				ricosDesempleados.get(i).Emplearce(nuevoCentro,60);
				pobresDesempleados.get(i).Emplearce(nuevoCentro,40);
			}
			//Se disminuye el nivel de desempleo en 20, tanto de los Pobres como Ricos
			Agentes.gobierno.setPersonasPobresDesempleadas(Agentes.gobierno.getPersonasPobresDesempleadas()-20);
			Agentes.gobierno.setPersonasRicasDesempleadas(Agentes.gobierno.getPersonasRicasDesempleadas()-20);
		}
		/*****************************************************************************************************/
		
		//Gobierno debe analizar nuevamente las Licencias 
		Agentes.gobierno.LicenciarConstruccionCenTrabajo();
		
	}
	
	/*******************************************************************************************************************
	 *Permite almacenar la referencia al ultimo Centro de Trabajo creado, y asi posteriormente emplear a la poblacion 
	 *tanto Rica como Pobre en dicho centro
	 */
	public void setNuevoCentro(CentroTrabajo nuevoCentro){
		this.nuevoCentro = nuevoCentro;
	}

	@Override
	public String toString(){
		return agentID;
	}
}
